package com.seeyon.apps.lzmzj.kit;

import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.seeyon.cap4.form.bean.FormBean;
import com.seeyon.cap4.form.bean.FormFieldBean;
import com.seeyon.ctp.common.AppContext;
import com.seeyon.ctp.common.log.CtpLogFactory;
import com.seeyon.ctp.form.modules.serialNumber.SerialNumberManager;
import com.seeyon.ctp.util.UUIDLong;
import org.apache.commons.logging.Log;

import java.util.*;

public class JsonKit {
    private static final Log log = CtpLogFactory.getLog(JsonKit.class);

    private static SerialNumberManager serialNumberManager = (SerialNumberManager) AppContext.getBean("serialNumberManager");

    /**
     * 此函数将JSON对象与表单字段列表结合，根据表单字段的描述从JSON中提取数据并转换，
     * 将结果存储在一个Map中，键为表单字段的显示名称，值为处理后的字段值。
     *
     * @param jsonObject 输入的JSON对象，包含需要提取的数据。
     * @param formFields 表单字段列表，每个元素包含字段描述、输入类型和显示名称。
     *                   表单字段的描述用于匹配JSON中的键，输入类型用于数据转换。
     * @return mainDataMap 返回一个Map，键为表单字段的显示名称，值为处理后的字段值。
     * 如果JSON对象中没有匹配的字段，或者转换失败，该字段不会出现在结果Map中。
     * @throws Exception 当数据转换过程中遇到问题时抛出异常。
     */
    public static Map<String, Object> mainData(JSONObject jsonObject, List<FormFieldBean> formFields) throws Exception {
        Map<String, Object> mainDataMap = new HashMap<String, Object>();
        // 遍历JSON对象，获取每个键值对
        if (!jsonObject.isEmpty()) {
            for (Map.Entry<String, Object> entry : jsonObject.entrySet()) {
                String fieldName = entry.getKey();
                String fieldValue = StrKit.str(entry.getValue());
                // 检查字段是否存在于表单字段列表中，并进行数据转换
                for (FormFieldBean formFieldBean : formFields) {
                    String fieldDesc = formFieldBean.getDesc().trim();
                    String fieldDesc_new = "";
                    if (fieldDesc.contains("_")) {
                        fieldDesc_new = fieldDesc.split("_")[1];
                    } else if (fieldDesc.contains("流水号-")) {
                        if (!mainDataMap.containsKey("serialNumber")) {
                            fieldDesc_new = fieldDesc.split("流水号-")[1];
                            log.info("流水号名称：" + fieldDesc_new);
                            String serialNumber = serialNumberManager.getSerialNumberValue(fieldDesc_new);
                            log.info("流水号：" + serialNumber);
                            mainDataMap.put(formFieldBean.getDisplay(), serialNumber);
                            mainDataMap.put("serialNumber", serialNumber);
                        }
                    } else {
                        fieldDesc_new = fieldDesc;
                    }
                    if (fieldDesc_new.equals(fieldName)) {
                        Object value = DataConversionKit.bpmDataConversion(formFieldBean.getInputType(), fieldValue, fieldDesc);
                        String value_new = StrKit.str(value);
                        if (value_new.contains("file_attachment_")) {
                            String fileUrl = value_new.split("file_attachment_")[1];
                            String fileUrl_new = fileUrl.replaceAll("\\[", "").replaceAll("]", "");
                            String[] fileUrls = fileUrl_new.split(",");
                            int i = 0;
                            List<Map<String, Object>> attsList = new ArrayList<Map<String, Object>>();
                            Long sub_reference = UUIDLong.longUUID();
                            for (String fileId : fileUrls) {
                                Map<String, Object> attMap = new HashMap<String, Object>();
                                int sort = i + 1;
                                // 将附件信息添加到列表中
                                attMap.put("fileUrl", fileId);
                                attMap.put("subReference", sub_reference);
                                attMap.put("sort", sort);
                                attsList.add(attMap);
                            }
                            mainDataMap.put("thirdAttachments", attsList);
                            mainDataMap.put(formFieldBean.getDisplay(), sub_reference);
                        } else if (value_new.contains("image_attachment_")) {
                            String fileUrl = value_new.split("image_attachment_")[1];
                            String fileUrl_new = fileUrl.replaceAll("\\[", "").replaceAll("]", "");
                            Long sub_reference = UUIDLong.longUUID();
                            mainDataMap.put("imageAttachments", fileUrl_new);
                            mainDataMap.put("image_sub_reference", sub_reference);
                            mainDataMap.put(formFieldBean.getDisplay(), sub_reference);
                        } else {
                            mainDataMap.put(formFieldBean.getDisplay(), StrKit.str(value));
                        }
                    }
                }
            }
        }
        // 返回处理后的数据Map
        return mainDataMap;
    }


    /**
     * 根据表单数据和JSON数组，提取并分类数据。
     * 此方法用于处理前端提交的JSON数组，根据表单字段的配置，将数据分类存储到一个Map中。
     * 每个表单字段对应的数据被组织成一个Map，所有字段的数据集合则以表名作为键存储在一个大的Map中。
     *
     * @param jsonArray 前端提交的JSON数组，包含所有待处理的数据。
     * @param formBean  表单配置信息，用于匹配JSON数据中的键和表单字段。
     * @return 返回一个Map，其中键是表名，值是一个List，包含所有对应表的字段数据Map。
     * @throws Exception 如果数据转换出现问题，抛出异常。
     */
    public static Map<String, List<Map<String, Object>>> subData(JSONArray jsonArray, FormBean formBean) throws Exception {
        // 初始化存储最终数据的Map
        Map<String, List<Map<String, Object>>> subDataMap = new HashMap<String, List<Map<String, Object>>>();
        // 获取表单字段配置信息
        List<FormFieldBean> formFieldBeans = formBean.getAllFieldBeans();
        // 初始化临时存储数据的List
        List<Map<String, Object>> subDataList = new ArrayList<Map<String, Object>>();
        // 遍历JSON数组中的每个对象
        for (int i = 0; i < jsonArray.size(); i++) {
            // 初始化存储当前JSON对象数据的Map
            Map<String, Object> dataMap = new HashMap<String, Object>();
            // 获取当前JSON对象
            JSONObject subJsonObject = jsonArray.getJSONObject(i);
            // 用于存储当前JSON对象对应的表名
            String tableName = "";
            // 遍历当前JSON对象的所有键值对
            for (Map.Entry<String, Object> entry : subJsonObject.entrySet()) {
                String key = entry.getKey();
                // 遍历表单字段配置，寻找与当前JSON键匹配的字段
                for (FormFieldBean formFieldBean : formFieldBeans) {
                    // 获取字段描述，去除空格
                    String fieldDesc = StrKit.str(formFieldBean.getDesc().trim());
                    // 如果字段描述不为空且与当前JSON键匹配
                    String fieldDesc_new = "";
                    if (fieldDesc.contains("_")) {
                        fieldDesc_new = fieldDesc.split("_")[1];
                    } else {
                        fieldDesc_new = fieldDesc;
                    }
                    if (fieldDesc_new.equals(key)) {
                        // 更新当前表名
                        tableName = formFieldBean.getOwnerTableName();
                        // 根据字段类型转换数据值
                        Object value = DataConversionKit.bpmDataConversion(formFieldBean.getInputType(), StrKit.str(entry.getValue()), fieldDesc);
                        // 将转换后的数据值添加到当前数据Map中
                        dataMap.put(formFieldBean.getDisplay(), value);
                    }
                }
            }
            // 根据表名将当前数据Map添加到对应的List中
            if (subDataMap.containsKey(tableName)) {
                List<Map<String, Object>> tempSubDataList = subDataMap.get(tableName);
                tempSubDataList.add(dataMap);
                subDataMap.put(tableName, tempSubDataList);
            } else {
                subDataList = new ArrayList<Map<String, Object>>();
                subDataList.add(dataMap);
                subDataMap.put(tableName, subDataList);
            }
        }
        // 返回最终的数据Map
        return subDataMap;
    }
}
